/*******************************************************************************
* Copyright (c) 2014, 2015 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
******************************************************************************/
package org.eclipse.e4.ui.tests.workbench;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.RegistryFactory;
import org.eclipse.e4.ui.internal.workbench.ExtensionsSort;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
/**
* Test for the {@link ExtensionsSort} class.
*/
public class ExtensionsSortTests {
Bundle root;
Bundle intermediate;
Bundle leaf;
@Before
public void setUp() throws Exception {
BundleContext context = FrameworkUtil.getBundle(getClass())
.getBundleContext();
// root has no dependencies on other test bundles
// intermediate depends on root, plus it re-exports
// leaf depends on intermediate, and should also then
// depend on root via the re-export
root = context
.installBundle(toFileURL("platform:/plugin/"
+ context.getBundle().getSymbolicName()
+ "/data/org.eclipse.extensionsSortTests/tests.extensions.root/"));
intermediate = context
.installBundle(toFileURL("platform:/plugin/"
+ context.getBundle().getSymbolicName()
+ "/data/org.eclipse.extensionsSortTests/tests.extensions.intermediate/"));
leaf = context
.installBundle(toFileURL("platform:/plugin/"
+ context.getBundle().getSymbolicName()
+ "/data/org.eclipse.extensionsSortTests/tests.extensions.leaf/"));
root.start(Bundle.START_TRANSIENT);
intermediate.start(Bundle.START_TRANSIENT);
leaf.start(Bundle.START_TRANSIENT);
}
@Test
public void testSortOrder() {
IExtensionRegistry registry = RegistryFactory.getRegistry();
IExtensionPoint extPoint = registry
.getExtensionPoint("org.eclipse.e4.workbench.model");
IExtension[] extensions = new ExtensionsSort().sort(extPoint
.getExtensions());
int rootIndex = indexOf(extensions, "test.extensions.root.model");
int intermediateIndex = indexOf(extensions,
"test.extensions.intermediate.model");
int leafIndex = indexOf(extensions, "test.extensions.leaf.model");
assertTrue(rootIndex < intermediateIndex);
assertTrue(intermediateIndex < leafIndex);
}
/** Bundle#installBundle() doesn't like platform:/plugin/-style URLs */
private String toFileURL(String url) throws MalformedURLException,
IOException {
return FileLocator.toFileURL(new URL(url)).toString();
}
private int indexOf(IExtension[] extensions, String id) {
for (int i = 0; i < extensions.length; i++) {
if (id.equals(extensions[i].getUniqueIdentifier())) {
return i;
}
}
fail("Could not find extensions with id " + id);
/* NOTREACHED */
return Integer.MIN_VALUE; // keep JDT happy
}
@After
public void tearDown() throws Exception {
if (root != null) {
root.uninstall();
}
if (intermediate != null) {
intermediate.uninstall();
}
if (leaf != null) {
leaf.uninstall();
}
}
}